package com.itcam.phaseii.innerclass;

public class AnonymousInnerClassDetail {
    public static void main(String[] args) {
        OuterCC outerCC = new OuterCC();
        outerCC.f1();
        System.out.println("main outerCC hashcode=" + outerCC);
    }
}

class OuterCC {
    private int n1 = 99;

    public void f1() {
        //创建一个基于类的匿名内部类
        //不能添加访问修饰符,因为它的地位就是一个局部变量
        //作用域: 仅仅在定义它的方法或代码块中
        Person p = new Person() {
            private int n1 = 88;

            @Override
            public void hi() {
                //可以直接访问外部类的所有成员，包含私有的
                //如果外部类和匿名内部类的成员重名时，匿名内部类访问的话，
                //默认遵循就近原则，如果想访问外部类的成员，则可以使用（外部类名.this.成员）去访问
                System.out.println("匿名内部类重写了hi方法n1 = " + n1);
                System.out.println("外部内的n1 = " + OuterCC.this.n1);
                //Outer05.this 就是调用f1 的对象
                System.out.println("Outer05.this hashcode=" + OuterCC.this);
            }
        };
        p.hi();//动态绑定, 运行类型是OuterCC$1

        // 也可以直接调用, 匿名内部类本身也是返回对象
        // class匿名内部类extends Person{}
        new Person() {
            @Override
            public void hi() {
                System.out.println("匿名内部类重写了hi方法,hhh...");
            }

            @Override
            public void ok(String str) {
                super.ok(str);
            }
        }.ok("Cammy");
    }
}

class Person { // 类
    public void hi() {
        System.out.println("Person.hi()");
    }

    public void ok(String str) {
        System.out.println("Person.ok()");
    }
}
